import axios from 'axios';
import {useUserStore} from "@/stores/userStore.js";
import {adminUserStore} from "@/stores/adminStore.js";
import router from "@/router/index.js";
import {ElMessage} from "element-plus";

// 创建 axios 实例
const instance = axios.create({
    baseURL: '/api', // 设置基础请求 URL
    timeout: 5000, // 请求超时设置
    headers: {
        'Content-Type': 'application/json' // 默认请求头
    }
});

// 请求拦截器：处理请求数据
instance.interceptors.request.use((config) => {
    const userStore = useUserStore()
    const adminStore = adminUserStore()

    // ==================== 双重校验 ====================
    const checkStore = (store) => {
        if (store.token) {
            if (!store.checkTokenExpiration()) {
                store.logout()
                router.replace('/login-register').then(() => {
                    ElMessage.warning(`登录已过期`)
                })
                return false
            }
            return true
        }
        return false
    }

    // 💡 优先校验管理员
    if (checkStore(adminStore)) {
        config.headers.Authorization = `Bearer ${adminStore.token}`
        return config
    }

    // 💡 其次校验用户
    if (checkStore(userStore)) {
        config.headers.Authorization = `Bearer ${userStore.token}`
        return config
    }

    // 💡 冲突处理：同时存在两种登录状态时
    if (userStore.isLogin && adminStore.isLogin) {
        console.error('检测到账户冲突，自动退出所有账户')
        userStore.logout()
        adminStore.logout()
        return Promise.reject(new Error('账户状态冲突'))
    }

    return config
})

// 响应拦截器：处理响应数据
instance.interceptors.response.use(
    // 直接返回数据部分，方便使用时直接获取
    (response) => {
        return response.data;
    },

    // 处理错误信息
    error => {
        if (error.response?.status === 401) {
            const userStore = useUserStore()
            const adminStore = adminUserStore()

            // 同时清除两种可能的状态
            userStore.logout()
            adminStore.logout()

            router.replace('/login-register').then(() => {
                ElMessage.error('登录凭证失效，请重新登录')
            })
        }
        return Promise.reject(error);
    }
);

export default instance;
